package com.sywl.ytcx.mapper;

import com.sywl.ytcx.config.OverallViewOrderRateVO;
import com.sywl.ytcx.config.PostViewOrderRateVO;
import com.sywl.ytcx.config.UserPostViewOrderRateVO;
import com.sywl.ytcx.entity.order.Order;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

@Mapper
public interface OrderListMapper {

    /** 查询全部用户“待付款”订单 */
    List<Order> findPendingPayment();

    /** 查询全部用户“已付款”订单 */
    List<Order> findPaid();

    /** 查询全部用户“待出稿”订单 */
    List<Order> findUnpublished();

    /** 查询全部用户“已出稿”订单 */
    List<Order> findPublished();


    /** 按用户ID查询订单 */
    List<Order> findByUserId(@Param("userId") int userId);

    /**
     * 按创建时间排序查询所有订单
     * @param sortOrder 排序顺序，"ASC" 或 "DESC"
     */
    List<Order> findAllByCreatedAt(@Param("sortOrder") String sortOrder);

    /**
     * 按订单金额排序查询所有订单
     * @param sortOrder 排序顺序，"ASC" 或 "DESC"
     */
    List<Order> findAllByTotalAmount(@Param("sortOrder") String sortOrder);



    /** 按订单号查询单个订单 */
    Order findByOrderNumber(@Param("orderNumber") String orderNumber);


    /** 按 order_id 精确查询 */
    Order findById(@Param("orderId") Long orderId);



    /**
     * 查询所有订单记录
     * @return List<Order> 所有订单的列表，按创建时间倒序排列
     */
    List<Order> findAll();

    /**
     * 根据用户名查询相关订单
     * 通过关联用户表，根据用户名精确匹配查询对应的订单列表
     *
     * @param username 用户名（来自user表的username字段）
     * @return List<Order> 与指定用户名关联的所有订单列表，按创建时间倒序排列
     */
    List<Order> findByUsername(@Param("username") String username);



    /** 按用户账号（auccount）查询订单 */
    List<Order> findByAccount(@Param("account") String account);


    /**
     * 根据用户ID查询订单
     * @param userId 用户ID
     * @return 订单列表
     */
    List<Order> selectByUserId(int userId);


    /**
     * 按创建日期排序查询用户订单
     * @param userId 用户ID
     * @return 按创建时间降序排列的订单列表
     */
    List<Order> selectOrdersByDateDesc(int userId);

    /**
     * 查询用户未付款订单
     * @param userId 用户ID
     * @return 状态为pending的订单列表
     */
    List<Order> selectUnpaidOrders(int userId);

    /**
     * 查询用户已付款订单
     * @param userId 用户ID
     * @return 状态为paid的订单列表
     */
    List<Order> selectPaidOrders(int userId);


    /**
     * 统计时间区间内订单总金额
     * @param start 开始时间
     * @param end   结束时间
     * @return 总金额
     */
    BigDecimal sumAmountBetween(@Param("start") LocalDateTime start,
                                @Param("end") LocalDateTime end);


    /**
     * 按时间范围筛选，返回 Order 实体列表
     * @param start 开始时间
     * @param end   结束时间
     */
    List<Order> selectByDateRange(@Param("start") LocalDateTime start,
                                  @Param("end")   LocalDateTime end);


    /**
     * 统计时间区间内订单总金额，可选 userId
     * @param userId 用户ID（null 则统计所有用户）
     */
    BigDecimal sumAmountBetween(@Param("userId") Integer userId,
                                @Param("start") LocalDateTime start,
                                @Param("end")   LocalDateTime end);

    /**
     * 查询所有退款订单
     * @return List<Order> status = 'cancelled' 的订单集合
     */
    List<Order> findCancelled();

    /**
     * 按时间范围查询退款订单
     * @param start LocalDateTime 起始时间（包含）
     * @param end   LocalDateTime 结束时间（包含）
     * @return List<Order> 指定时间段内 status = 'cancelled' 的订单集合
     */
    List<Order> findCancelledByDate(@Param("start") LocalDateTime start,
                                    @Param("end")   LocalDateTime end);


    /**
     * 按日期范围查询指定用户的退款订单
     * @param userId 用户ID
     * @param start  起始时间
     * @param end    结束时间
     */
    List<Order> findCancelledByUserAndDate(@Param("userId") int userId,
                                           @Param("start")   LocalDateTime start,
                                           @Param("end")     LocalDateTime end);


    /** 查询指定用户的所有退款订单 */
    List<Order> findCancelledByUser(@Param("userId") int userId);


    /**
     * selectPostViewOrderRates
     *
     * 查询每篇帖子的浏览-下单转化率。
     * @return List<PostViewOrderRateVO>
     */
    List<PostViewOrderRateVO> selectPostViewOrderRates();

    /**
     * selectOverallViewOrderRate
     *
     * 查询全站范围的浏览-下单整体转化率。
     * @return OverallViewOrderRateVO
     */
    OverallViewOrderRateVO selectOverallViewOrderRate();



    /**
     * selectUserPostViewOrderRate
     *
     * 查询单个用户（userId）所有发帖的浏览→下单转化率
     *
     * @param userId 发帖用户 ID
     * @return UserPostViewOrderRateVO 包含 totalViews/totalOrders/conversionRatePct
     */
    UserPostViewOrderRateVO selectUserPostViewOrderRate(int userId);



}